/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package camada.bancodedados.daoimplemente;

import eloma.classe.Funcionario;
import camada.bancodedados.conexao.Conexao;
import camada.negocio.dao.FuncionarioDAO;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author Icaro
 */
public class FuncionarioDAOImpl implements FuncionarioDAO {

    public void inserir(Funcionario func) {
        PreparedStatement pstm = null;
        try {
            final String SQL_INSERT
                    = "insert into funcionario(nome,datanascimento,telefone,celular,endereco,"
                    + " numero,complemento,cep,bairro,cidade,uf,salario)values(?,?,?,?,?,?,?,?,?,?,?,?)";
            pstm = Conexao.getCon().prepareStatement(SQL_INSERT);
            pstm.setString(1, func.getNome());
            pstm.setString(2, func.getDataNascimento());
            pstm.setString(3, func.getTelefone());
            pstm.setString(4, func.getCelular());
            pstm.setString(5, func.getEndereco());
            pstm.setString(6, func.getNumero());
            pstm.setString(7, func.getComplemento());
            pstm.setString(8, func.getCep());
            pstm.setString(9, func.getBairro());
            pstm.setString(10, func.getCidade());
            pstm.setString(11, func.getUf());
            pstm.setFloat(12, func.getSalario());
            pstm.executeUpdate();
            JOptionPane.showMessageDialog(null, "O Cliente " + func.getNome() + ", foi cadastrado com sucesso!");
        } catch (SQLException e) {
            System.out.println("Erro ao inserir dados!!!\n" + e.getMessage());
        }
    }

    public Funcionario getFuncionarioPorUserName(String nomeFuncionario) throws Exception {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            final String SQL_PESQUISA_USUARIO = "select * from Funcionario where nome = ?";
            stmt = Conexao.getCon().prepareStatement(SQL_PESQUISA_USUARIO);
            stmt.setString(1, nomeFuncionario);
            rs = stmt.executeQuery();
            return carregarResultadoSimples(rs);
        } catch (SQLException sqle) {
            throw new Exception(sqle);
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
        }
    }

    public void atualizar(Funcionario func) {
        PreparedStatement pstm = null;
        try {
            final String SQL_UPDATE
                    = "UPDATE Funcionario SET nome = ? ,datanascimento = ?, telefone = ?,"
                    + "telefonefax = ?, celular = ?, endereco = ?, numero = ?, complemento = ?, cep = ?,bairro, "
                    + "cidade = ?, uf = ?, salario = ?  WHERE idfuncionario = ?";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_UPDATE);
            pstm.setString(1, func.getNome());
            pstm.setString(2, func.getDataNascimento());
            pstm.setString(3, func.getTelefone());
            pstm.setString(4, func.getCelular());
            pstm.setString(5, func.getEndereco());
            pstm.setString(6, func.getNumero());
            pstm.setString(7, func.getComplemento());
            pstm.setString(8, func.getCep());
            pstm.setString(9, func.getBairro());
            pstm.setString(10, func.getCidade());
            pstm.setString(11, func.getUf());
            pstm.setFloat(12, func.getSalario());
            pstm.setFloat(13, func.getIdfuncionario());
            pstm.executeUpdate();
            JOptionPane.showMessageDialog(null, "Atualização realizada com sucesso!");
        } catch (SQLException e) {
            System.out.println("Erro ao atualizar dados!!!\n" + e.getMessage());
        }
    }

    public void remover(Funcionario func) {
        PreparedStatement pstm = null;
        try {
            final String SQL_DELETE = "delete from Funcionario where idfuncionario = ?";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_DELETE);
            pstm.setInt(1, func.getIdfuncionario());
            pstm.executeUpdate();
            JOptionPane.showMessageDialog(null, "O usuário " + func.getNome() + " foi removido com sucesso!");
        } catch (SQLException e) {
            System.out.println("Erro ao inserir dados!!!\n" + e.getMessage());
        }

    }

    public List<Funcionario> findAll() throws Exception {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String SQL_STATEMENT = "Select * from Funcionario order by NOME";
        try {
            stmt = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_STATEMENT);
            rs = stmt.executeQuery();
            return carregarMultiplosResultados(rs);
        } catch (SQLException sqle) {
            throw new Exception(sqle);
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
        }
    }

    public List<Funcionario> carregarMultiplosResultados(ResultSet rs) throws SQLException {
        List<Funcionario> resultList = new ArrayList<Funcionario>();
        while (rs.next()) {
            Funcionario dto = new Funcionario();
            carregarVO(dto, rs);
            resultList.add(dto);
        }
        return resultList;
    }

    private Funcionario carregarResultadoSimples(ResultSet rs) throws SQLException {
        if (rs.next()) {
            Funcionario dto = new Funcionario();
            carregarVO(dto, rs);
            return dto;
        } else {
            return null;
        }
    }

    private void carregarVO(Funcionario dto, ResultSet rs) throws SQLException {
        dto.setIdfuncionario(rs.getInt("IdFuncionario"));
        dto.setNome(rs.getString("Nome"));
        dto.setDataNascimento("DataNascimento");
        dto.setTelefone(rs.getString("Telefone"));
        dto.setCelular(rs.getString("Celular"));
        dto.setEndereco(rs.getString("Endereco"));
        dto.setNumero(rs.getString("numero"));
        dto.setComplemento(rs.getString("Complemento"));
        dto.setCep(rs.getString("Cep"));
        dto.setBairro(rs.getString("Bairro"));
        dto.setCidade(rs.getString("Cidade"));
        dto.setUf(rs.getString("UF"));
        dto.setSalario(rs.getFloat("Salario"));
    }

}
